"""
@author: xxw
@file: 02.多线程使用.py
@time: 2023/6/26 11:43
"""
import threading
import requests

import time

def runtime(func):
    # 保留原数据，将func的源数据全部赋值给inner
    # @functools.wraps(func)
    def inner(*args, **kwargs):  # *args  **kwargs 让装饰器更加通用
        start = time.time()
        result = func(*args, **kwargs) #原函数执行
        end = time.time()
        print(f"函数执行花了{end-start}s")
        # print(f"执行了{func.__name__}函数")
        return result             #inner函数返回原函数的返回值
    return inner

def get_content(url):
    result = requests.get(url).text
    time.sleep(0.5)
    print("get url")
@runtime
def main():
    print("start....")
    # for i in range(5):
    #     get_content("http://www.baidu.com")

    t_list = []
    #使用多线程
    for i in range(5):
        # target --> 线程要做的任务是什么  --》传入一个callable对象，做什么
        # args --> 指定要传入的参数，元组
        t = threading.Thread(target=get_content,args=("http://www.baidu.com",))
        # 前台线程、后台线程     在start之前设置
        # 默认是False 前台线程 -- 主线程等待子线程结束才退出
        # 设置为true 后台线程 -- 主线程执行结束，子线程就退出
        t.setDaemon(True)
        t.start()   #启动的时候自动调用run方法，run方法里面又去调用传递进来的target
        t_list.append(t)
    for t in t_list:
        t.join()  #阻塞当前环境上下文，直到t的线程执行完成

main()
print("ending....")

# 自定义线程类
class MyThread(threading.Thread):
    def __init__(self, num):
        super().__init__()
        self.num = num

    def run(self):
        print(f"running...{self.num}")

t1 = MyThread(1)
t2 = MyThread(2)
t1.start()
t2.start()